package org.smile.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * 正则表达式类
 * @author strive
 *
 */
public class RegExp {
	
	private Pattern p;
	/**
	 * 构造方法
	 * @param reg 正则表达式规则
	 */
	public RegExp(String reg)
	{
		this.p=Pattern.compile(reg);
	}
	/**
	 * 构造方法
	 * @param reg 正则表达式规则
	 */
	public RegExp(String reg,boolean IgnoreCase)
	{
		if(IgnoreCase==false){
			this.p=Pattern.compile(reg, Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
		}else{
			this.p=Pattern.compile(reg);
		}
	}
	/**
	 * 从一个字符串中匹配查找  
	 *    如:new RegExp("[a-b]+").find("13fgb45d45");
	 *    结果：["fgb","d"]
	 * @param s
	 * @return 匹配规则的 子字符串数组
	 */
	public String[] find(String s)
	{
		List<String> list=new ArrayList<String>();
		Matcher m=p.matcher(s);
		while(m.find())
		{
			list.add(m.group());
		}
		return convert(list);
	}
	/**
	 * 查找第一个匹配
	 * @param s
	 * @return 匹配的子字符串
	 */
	public String first(String s){
		Matcher m=p.matcher(s);
		while(m.find())
		{
			return m.group();
		}
		return null;
	}
	/**
	 * 第一个匹配的索引
	 * @param s
	 * @return
	 */
	public int firstIndex(String s){
		Matcher m=p.matcher(s);
		int index=-1;
		while(m.find()){
			return m.start();
		}
		return index;
	}
	/**
	 * 第一个匹配结束的索引位置
	 * @param s
	 * @return
	 */
	public int firstIndexEnd(String s){
		Matcher m=p.matcher(s);
		int index=-1;
		while(m.find()){
			return m.end();
		}
		return index;
	}
	/**
	 * 以正则表达式分割一个字符串为一个数组
	 * 分割出来的数组中为空的被去除 只保存不为空的
	 * 如: new EegExp("b").split("erbb h b q");
	 *     的结果为:["er","h","q"]
	 * @param s
	 * @return
	 */
	public String[] split(String s)
	{
		String[] strs=p.split(s);
		List<String> list=new ArrayList<String>();
		for(String str:strs)
		{
			if(str!=null&&!"".equals(str.trim()))
			{
				list.add(str);
			}
		}
		return this.convert(list);
	}
	/**
	 * 替换一个字符串
	 * @param resurceStr 被替换的目标字符串
	 * @param newStr 要替换成
	 * @return 新字符串
	 */
	public String replaceAll(String resurceStr,String newStr)
	{
		return resurceStr.replaceAll(getFormatStr(), newStr);
	}
	/**
	 * 得到正则表达式字符串
	 * @return
	 */
	public String getFormatStr()
	{
		return this.p.pattern();
	}
	/**
	 * 是否可存在匹配
	 * @param s
	 * @return
	 */
	public boolean test(String s)
	{
		Matcher m=p.matcher(s);
		if(m.find())
		{
			return true;
		}else
		{
			return false;
		}
	}
	/**
	 * 返回 创建的匹配器
	 * @param s
	 * @return
	 */
	public Matcher matcher(String s){
		return p.matcher(s);
	}
	/**
	 * 最后一次匹配的索引
	 * @param s
	 * @return
	 */
	public int lastIndex(String s){
		Matcher m=p.matcher(s);
		int index=-1;
		while(m.find()){
			index=m.start();
		}
		return index;
	}
	/**
	 * 最后一次匹配的字符串后后面的索引
	 * @param s
	 * @return
	 */
	public int lastIndexEnd(String s){
		Matcher m=p.matcher(s);
		int index=-1;
		while(m.find()){
			index=m.end();
		}
		return index;
	}
	/**
	 * 最后匹配的子字符串
	 * @param s
	 * @return
	 */
	public String last(String s){
		Matcher m=p.matcher(s);
		String result=null;
		while(m.find()){
			result=m.group();
		}
		return result;
	}
	/**
	 * 把集合转为字符串数组
	 * @param list
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private String[] convert(List list)
	{
		int i=0,size=list.size();
		if(size>0)
		{
			String[] strs=new String[size];
			for(i=0;i<size;i++)
			{
				strs[i]=list.get(i).toString();
			}
			return strs;
		}else{
			return null;
		}
	}
}
